﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DrugStore.Helper;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using DrugStore.Exceptions;
using System.ComponentModel;

namespace DrugStore.Models
{
    public class ManageNewModel
    {                
        public String NewsId { get; set; }
        
        [Required(ErrorMessage = "Tiêu đề là bắt buộc")]
        [DisplayName("Tiêu đề: ")]
        public String Title { get; set; }

        [Required(ErrorMessage = "Nội dung là bắt buộc")]
        [DisplayName("Nội dung: ")]
        public String Content { get; set; }
      
        [DisplayName("Ảnh đại diện: ")]
        public String ImagePath { get; set; }        
        
        public int Status { get; set; }
       
        public DateTime DateCreate { get; set; }

        public List<Category> Categories { get; set; }

        [DisplayName("Danh mục tin: ")]
        [Required(ErrorMessage="Nếu bạn không chọn danh mục, website sẽ không thể tự động hiển thị tin này")]
        public List<String> SelectedCategories { get; set; }

        public void setSelectedCategories(List<Category> categories) {
            SelectedCategories = new List<String>();
            foreach (Category c in categories)
            {
                SelectedCategories.Add(c.CategoryId.ToString());
            }
        }
    }

    public class ManageNewBusiness 
    {
        public PaginateList<News> Search(string keyword, string field, int pageIndex, int pageSize, string orderField, string direction) 
        {
            DrugStoreEntities entities = new DrugStoreEntities();
            IQueryable<News> news = entities.News;
            news = from n in news
                   orderby n.DateCreate descending
                   select n;

            List<News> list = news.ToList();
            if (!String.IsNullOrEmpty(keyword)) 
            {
                if ("Title".Equals(field, StringComparison.OrdinalIgnoreCase))
                {
                    news = news.Where(n=>n.Title.Contains(keyword));
                }
            }

            PaginateList<News> results = new PaginateList<News>(news, pageIndex, pageSize, keyword, field, orderField, direction);
            return results;
        }

        public ManageNewModel GetNewsById(String id) 
        {
            Guid newId = Guid.Empty;
            if(!Guid.TryParse(id,out newId))
            {
                throw new ParameterInvalidException("", "Không tồn tại tin này!");             
            }                         
            DrugStoreEntities entities = new DrugStoreEntities();
            News news = entities.News.FirstOrDefault(n => n.NewsId == newId);
            if (news == null) 
            {
                throw new Exception("Tin nay khong ton tai!");
            }

            ManageNewModel model = new ManageNewModel();
            model.NewsId = news.NewsId.ToString();
            model.Title = news.Title;
            model.Content = news.Containts;
            model.DateCreate = news.DateCreate;
            model.ImagePath = news.ImagePath;
            model.Status = news.Status;
            model.setSelectedCategories(news.Categories.ToList());
            model.Categories = entities.Categories.ToList();
            return model;            
        }

        public NewsCategoryModel GetNewsCategoryModel(String categoryId)
        {
            NewsCategoryModel model = new NewsCategoryModel();
            DrugStoreEntities entities = new DrugStoreEntities();
            if (!String.IsNullOrEmpty(categoryId))
            {
                Guid id;
                if (Guid.TryParse(categoryId, out id))
                {
                    Category category = entities.Categories.FirstOrDefault(c => c.CategoryId == id);
                    if (category == null)
                    {
                        throw new Exception("Danh mục này không tồn tại");
                    }
                    model.CategoryId = category.CategoryId.ToString();
                    model.Name = category.Name;
                    model.Description = category.BriefDesc;
                }
                else throw new Exception("Danh mục này không tồn tại");
            }
            model.Categories = entities.Categories.ToList();
            return model;
        }

        public List<Category> GetAllCategory()
        {
            DrugStoreEntities entities = new DrugStoreEntities();
            return entities.Categories.ToList();
        }

        public void UpdateCategory(NewsCategoryModel model)
        {
            DrugStoreEntities entities = new DrugStoreEntities();
            Guid id;
            if (Guid.TryParse(model.CategoryId, out id))
            {
                Category category = entities.Categories.FirstOrDefault(c => c.CategoryId == id);
                if (category == null)
                {
                    throw new Exception("Danh mục này không tồn tại");
                }
                category.Name = model.Name;
                category.BriefDesc = model.Description;
                entities.SaveChanges();
            }
            else throw new Exception("Danh mục này không tồn tại");
        }

        public void AddCategoty(NewsCategoryModel model)
        {
            DrugStoreEntities entities = new DrugStoreEntities();
            Category category = entities.Categories.FirstOrDefault(c => c.Name.Equals(model.Name, StringComparison.OrdinalIgnoreCase));
            if (category != null)
            {
                throw new Exception("Tên danh mục này đã tồn tại");
            }
            Category newCategory = new Category();
            newCategory.CategoryId = Guid.NewGuid();
            newCategory.Name = model.Name;
            newCategory.BriefDesc = model.Description;
            entities.Categories.AddObject(newCategory);
            entities.SaveChanges();
        }

        public void DeleteCategoty(String categoryId)
        {
            DrugStoreEntities entities = new DrugStoreEntities();
            Guid id;
            if (Guid.TryParse(categoryId, out id))
            {
                Category category = entities.Categories.FirstOrDefault(c => c.CategoryId == id);
                if (category != null)
                {
                    foreach (News n in category.News)
                    {
                        entities.News.DeleteObject(n);
                    }
                    entities.SaveChanges();
                    foreach (Disease d in category.Diseases)
                    {
                        entities.Diseases.DeleteObject(d);
                    }
                    entities.SaveChanges();
                    entities.Categories.DeleteObject(category);
                    entities.SaveChanges();
                }
            }
            throw new Exception("Danh mục này không tồn tại");
        }
    }
}